Page({
  data: {
    // --- AI 学习计划生成 ---
    planForm: {
      subject: '',
      targetScore: '',
      examDate: ''
    },
    generatingPlan: false, // 是否正在生成计划
    generatedPlanResult: '', // AI生成的计划结果

    // --- 我的学习计划 ---
    studyPlans: [], // 从本地存储加载
    planStatusMap: {
      pending: '待开始',
      ongoing: '进行中',
      done: '已完成'
    },

    // --- AI 知识点薄弱分析 ---
    analyzingWeakness: false, // 是否正在分析
    weaknessAnalysisResult: '', // AI分析结果
    recommendedResources: [], // AI推荐资源

    // --- AI 模拟测验 ---
    startingQuiz: false, // 是否正在准备测验
    lastQuizResult: '', // 上次测验结果
    lastQuizAssessment: '', // AI评估

    // --- 考前焦虑疏导 ---
    anxietyTip: '', // AI减压提示

    // --- AI API 相关 ---
    // 切换到智谱AI
    useZhipuAI: true, // 使用智谱AI而不是OpenRouter
    apiFailedCount: 0 // API调用失败次数
  },

  onLoad: function (options) {
    this.loadData();
    this.generateAnxietyTip(); // 每次加载生成一个随机提示
  },

  onShow: function() {
    // 页面显示时可能需要重新加载数据，例如从计划详情页返回
     this.loadStudyPlans();
  },

  // --- 数据加载与保存 ---
  loadData: function() {
    this.loadStudyPlans();
    this.loadWeaknessAnalysis();
    this.loadLastQuiz();
  },

  loadStudyPlans: function() {
    const plans = wx.getStorageSync('studyPlans') || [];
    this.setData({ studyPlans: plans });
  },

  saveStudyPlans: function() {
    wx.setStorageSync('studyPlans', this.data.studyPlans);
  },

  loadWeaknessAnalysis: function() {
    const result = wx.getStorageSync('weaknessAnalysisResult') || '暂无分析结果。';
    const resources = wx.getStorageSync('recommendedResources') || [];
    this.setData({
        weaknessAnalysisResult: result,
        recommendedResources: resources
    });
  },

  saveWeaknessAnalysis: function() {
     wx.setStorageSync('weaknessAnalysisResult', this.data.weaknessAnalysisResult);
     wx.setStorageSync('recommendedResources', this.data.recommendedResources);
  },

  loadLastQuiz: function() {
    const result = wx.getStorageSync('lastQuizResult') || '暂无测验记录。';
    const assessment = wx.getStorageSync('lastQuizAssessment') || '';
    this.setData({
        lastQuizResult: result,
        lastQuizAssessment: assessment
    });
  },

  saveLastQuiz: function() {
      wx.setStorageSync('lastQuizResult', this.data.lastQuizResult);
      wx.setStorageSync('lastQuizAssessment', this.data.lastQuizAssessment);
  },

  // --- 事件处理 ---
  handleInputChange: function(e) {
    const field = e.currentTarget.dataset.field;
    const value = e.detail.value;
    this.setData({
      [field]: value
    });
  },

  handleDateChange: function(e) {
    const field = e.currentTarget.dataset.field;
    const value = e.detail.value;
    this.setData({
      [field]: value
    });
  },

  // --- AI 功能 ---

  /**
   * 调用AI API的通用函数
   * @param {Array<object>} messages - 发送给模型的消息数组
   * @param {string} loadingFlag - 控制加载状态的 data 属性名
   * @param {string} resultField - 存储结果的 data 属性名
   * @param {function} [onSuccess] - 成功回调
   * @param {function} [onError] - 失败回调
   * @param {string} [mockDataType] - 模拟数据类型
   */
  callAIAPI: function(messages, loadingFlag, resultField, onSuccess, onError, mockDataType) {
    if (mockDataType === undefined) mockDataType = 'default';
    
    var startObj = {};
    startObj[loadingFlag] = true;
    startObj[resultField] = '';
    this.setData(startObj); // 开始加载，清空旧结果

    // 引入智谱AI模块
    var zhipuAI = require('../../utils/zhipu_ai');
    
    // 使用智谱AI API
    if (this.data.useZhipuAI) {
      var self = this;
      zhipuAI.callZhipuAPI(messages, {
        model: 'glm-4-air-250414', // 使用较小的模型以降低成本
        fallbackToMock: true, // 开启API调用失败时自动使用模拟数据
        mockType: mockDataType, // 设置模拟数据类型
        onSuccess: function(aiResponse, fullResponse) {
          console.log('智谱AI响应成功:', aiResponse);
          
          // 如果是模拟数据返回，显示通知
          if (fullResponse && fullResponse.mock) {
            wx.showToast({
              title: '使用模拟数据返回结果',
              icon: 'none',
              duration: 2000
            });
          } else {
            var countObj = {apiFailedCount: 0};
            self.setData(countObj); // 重置失败计数
          }
          
          // 设置结果
          var resultObj = {};
          resultObj[resultField] = aiResponse.trim();
          self.setData(resultObj);
          if (onSuccess) onSuccess(aiResponse.trim());
        },
        onError: function(errorMsg, errorData) {
          console.error('智谱AI响应错误:', errorMsg, errorData);
          
          // 增加失败计数
          var newFailCount = self.data.apiFailedCount + 1;
          var countObj = {apiFailedCount: newFailCount};
          self.setData(countObj);
          
          // 错误处理
          if (errorMsg.includes('429') || errorMsg.includes('401')) {
            var toastMsg = errorMsg.includes('429') 
              ? '今日API调用次数已超限，使用模拟数据'
              : 'API认证失败，使用模拟数据';
              
            wx.showToast({
              title: toastMsg,
              icon: 'none',
              duration: 3000
            });
            
            // 使用模拟数据
            self.handleExamHelperMockData(mockDataType, resultField, onSuccess);
          } else {
            // 其他错误
            var errObj = {};
            errObj[resultField] = 'AI 服务暂时不可用: ' + errorMsg;
            self.setData(errObj);
            if (onError) onError(errorMsg);
          }
        },
        onComplete: function() {
          var completeObj = {};
          completeObj[loadingFlag] = false;
          self.setData(completeObj); // 结束加载
        }
      }).catch(function(err) {
        console.error('AI API调用异常:', err);
        var errObj = {};
        errObj[loadingFlag] = false;
        errObj[resultField] = '网络请求失败，请稍后再试';
        self.setData(errObj);
        if (onError) onError('网络请求失败');
      });
    } else {
      // 使用模拟数据模式
      var self = this;
      setTimeout(function() {
        self.handleExamHelperMockData(mockDataType, resultField, onSuccess);
        var loadingObj = {};
        loadingObj[loadingFlag] = false;
        self.setData(loadingObj);
        
        wx.showToast({
          title: '使用模拟数据模式',
          icon: 'none'
        });
      }, 1000);
    }
  },
  
  // 为考试助手提供模拟数据
  handleExamHelperMockData: function(mockDataType, resultField, onSuccess) {
    let mockResult = '';
    switch (mockDataType) {
      case 'study_plan':
        mockResult = `1. 第一周(${new Date().toLocaleDateString()} - ${new Date(Date.now() + 7*24*60*60*1000).toLocaleDateString()})：
- 整理教材和笔记，制定详细计划
- 复习基础知识点，力求全面掌握
- 每天练习基础题型2小时

2. 第二周：
- 进阶知识点攻克，理解重点难点
- 开始做模拟题，找出薄弱环节
- 错题整理与分析，针对性强化

3. 考前一周：
- 全面复习，查漏补缺
- 模拟考试训练，适应考试节奏
- 调整作息，保证充足睡眠`;
        break;
      case 'weakness_analysis':
        mockResult = `薄弱知识点：函数的极限与连续性，多元微积分中的偏导数\n推荐资源：《高数辅导讲义》，"数学分析基础视频课程"`;
        break;
      case 'quiz_assessment':
        mockResult = `预估得分：75-85分。常见失分点：证明题逻辑不严密，计算题细节错误。建议：多做类似证明题训练逻辑，注重计算过程检查。`;
        break;
      default:
        mockResult = '模拟数据：AI分析结果将在此显示';
    }
    
    this.setData({ [resultField]: mockResult });
    if (onSuccess) onSuccess(mockResult);
  },

  // 1. 生成学习计划
  generatePlan: function() {
    const { subject, targetScore, examDate } = this.data.planForm;
    if (!subject || !targetScore || !examDate) {
      wx.showToast({ title: '请填写完整信息', icon: 'none' });
      return;
    }

    const userPrompt = `请为我生成一个关于科目 "${subject}" 的学习计划。\n我的目标分数是 ${targetScore} 分，考试日期是 ${examDate}。\n**必须**使用中文回答，请提供一个**极其简洁**的、结构化的周度或每日计划建议，只包含核心复习点和大致时间安排。不要任何解释或额外说明。`;

    const messages = [{ role: 'user', content: userPrompt }];

    this.callAIAPI(
        messages,
        'generatingPlan',
        'generatedPlanResult',
        (aiResponse) => {
            // 成功后可以考虑解析AI响应，创建一个结构化的计划对象并保存
            wx.showModal({
                title: '学习计划已生成',
                content: 'AI 已为您生成计划建议，请在下方查看。是否将此概要添加至"我的学习计划"列表？（此为示例，实际需解析）',
                success: (res) => {
                    if (res.confirm) {
                       // 模拟添加一个计划项
                       const newPlan = {
                           id: Date.now(), // 简单ID
                           name: `${subject} 学习计划 (目标 ${targetScore})`,
                           status: 'pending', // pending, ongoing, done
                           progress: 0,
                           details: aiResponse // 保存完整AI回复
                       };
                       const updatedPlans = [newPlan, ...this.data.studyPlans];
                       this.setData({ studyPlans: updatedPlans });
                       this.saveStudyPlans();
                       wx.showToast({ title: '计划已添加', icon: 'success'});
                    }
                }
            });
        },
        null,
        'study_plan'
    );
  },

  // 2. 查看完整计划
  viewFullPlan: function() {
    // 这里应该跳转到一个新的页面来展示和管理所有计划
    // 传递计划数据或ID给新页面
    wx.navigateTo({
      url: '/pages/exam_helper/exam_detail/exam_detail', // 假设有这个页面
      // 可以通过事件通道传递复杂数据
      // success: (res) => {
      //   res.eventChannel.emit('acceptDataFromOpenerPage', { data: this.data.studyPlans })
      // }
    });
     wx.showToast({ title: '跳转到计划详情页', icon: 'none'});
  },

  // 3. 分析知识点薄弱 (模拟 + AI)
  analyzeWeakness: function() {
     // 实际应用中，这里需要获取用户的学习数据（如练习记录、笔记）
     const userPrompt = "假设我最近在学习高等数学。请根据一般学生的常见情况，分析最多 1-2 个核心薄弱知识点，并推荐最多 1-2 个最相关的学习资源（仅需名称）。**必须**使用中文回答，**极其简洁**，不要任何解释。";
     const messages = [{ role: 'user', content: userPrompt }];

     this.callAIAPI(
         messages,
         'analyzingWeakness',
         'weaknessAnalysisResult', // 先更新主要分析结果
         (aiResponse) => {
            // 尝试解析AI回复提取资源 (简单示例)
            const resources = [];
            const lines = aiResponse.split('\n');
            lines.forEach(line => {
                // 寻找可能的链接或资源标题 (非常基础的匹配)
                if (line.includes('http') || line.toLowerCase().includes('视频') || line.toLowerCase().includes('练习')) {
                     // 假设整行是一个资源描述
                     resources.push({ title: line.trim(), url: '' }); // 实际需要更复杂的解析提取URL
                }
            });
             // 如果解析出了资源，就更新
             if(resources.length > 0) {
                 this.setData({ recommendedResources: resources.slice(0, 3) }); // 最多显示3条
             } else {
                 // 如果没解析出，可以给个默认提示
                 this.setData({ recommendedResources: [{ title: '暂未解析到具体资源链接', url: '' }] });
             }
             this.saveWeaknessAnalysis(); // 保存分析结果和推荐资源
             wx.showToast({ title: '薄弱点分析完成', icon: 'success' });
         },
         null,
         'weakness_analysis'
     );
  },

  // 4. 开始模拟测验 (模拟 + AI)
  startQuiz: function() {
     // 实际应用中，需要选择科目和难度
     const userPrompt = "请为我生成一个关于大学英语四级的模拟测验评估。假设我刚完成测试。**必须**使用中文回答，**极其简洁**地评估可能的得分范围，并指出最多 1-2 个常见失分点和提升建议。不要任何解释。";
     const messages = [{ role: 'user', content: userPrompt }];

     this.callAIAPI(
         messages,
         'startingQuiz',
         'lastQuizAssessment', // 更新AI评估部分
         (aiResponse) => {
            // 模拟一个分数结果
            const score = Math.floor(Math.random() * 30) + 60; // 60-90分随机
            this.setData({ lastQuizResult: `模拟得分: ${score}分` });
            this.saveLastQuiz(); // 保存分数和评估
            wx.showToast({ title: '模拟测验完成', icon: 'success' });
         },
         (errorMsg) => {
             // API失败也给个模拟结果
             this.setData({ lastQuizResult: '模拟测验 (评估失败)', lastQuizAssessment: '' });
             this.saveLastQuiz();
         },
         'quiz_assessment'
     );
  },

   // 5. 生成随机焦虑提示
   generateAnxietyTip: function() {
    const tips = [
      "深呼吸几次，专注于你的呼吸。",
      "短暂休息一下，散散步或听听音乐。",
      "记住你已经付出的努力，相信自己。",
      "将大的复习任务分解成小块，逐步完成。",
      "和朋友或家人聊聊，倾诉你的感受。",
      "保证充足的睡眠，这对大脑功能至关重要。",
      "积极地思考，想象自己成功的场景。",
      "考试只是过程，不是终点，尽力就好。"
    ];
    const randomIndex = Math.floor(Math.random() * tips.length);
    this.setData({ anxietyTip: tips[randomIndex] });
  },
})
